package com.cencat.order.mapper;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.cencat.order.entity.OrderItem;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select;
import org.apache.ibatis.annotations.Update;

import java.math.BigDecimal;
import java.time.LocalDateTime;
import java.util.List;
import java.util.Map;

/**
 * 订单明细数据访问层
 * @author cencat
 * @description 固定商家场景多租户SaaS企业综合管理系统订单明细数据访问层
 * @since 2024-01-01
 */
@Mapper
public interface OrderItemMapper extends BaseMapper<OrderItem> {

    /**
     * 根据订单ID查询订单明细列表
     * @param orderId 订单ID
     * @param tenantId 租户ID
     * @return 订单明细列表
     */
    @Select("SELECT * FROM t_order_item WHERE order_id = #{orderId} AND tenant_id = #{tenantId} AND is_deleted = 0 ORDER BY id")
    List<OrderItem> selectByOrderId(@Param("orderId") Long orderId, @Param("tenantId") Long tenantId);

    /**
     * 根据订单编号查询订单明细列表
     * @param orderNo 订单编号
     * @param tenantId 租户ID
     * @return 订单明细列表
     */
    @Select("SELECT * FROM t_order_item WHERE order_no = #{orderNo} AND tenant_id = #{tenantId} AND is_deleted = 0 ORDER BY id")
    List<OrderItem> selectByOrderNo(@Param("orderNo") String orderNo, @Param("tenantId") Long tenantId);

    /**
     * 根据产品ID查询订单明细列表
     * @param productId 产品ID
     * @param tenantId 租户ID
     * @param startTime 开始时间
     * @param endTime 结束时间
     * @return 订单明细列表
     */
    List<OrderItem> selectByProductId(@Param("productId") Long productId, @Param("tenantId") Long tenantId,
                                     @Param("startTime") LocalDateTime startTime, @Param("endTime") LocalDateTime endTime);

    /**
     * 根据商家ID查询订单明细列表
     * @param merchantId 商家ID
     * @param tenantId 租户ID
     * @param startTime 开始时间
     * @param endTime 结束时间
     * @return 订单明细列表
     */
    List<OrderItem> selectByMerchantId(@Param("merchantId") Long merchantId, @Param("tenantId") Long tenantId,
                                      @Param("startTime") LocalDateTime startTime, @Param("endTime") LocalDateTime endTime);

    /**
     * 统计订单明细数量
     * @param orderId 订单ID
     * @param tenantId 租户ID
     * @return 明细数量
     */
    @Select("SELECT COUNT(*) FROM t_order_item WHERE order_id = #{orderId} AND tenant_id = #{tenantId} AND is_deleted = 0")
    Integer countByOrderId(@Param("orderId") Long orderId, @Param("tenantId") Long tenantId);

    /**
     * 计算订单明细总金额
     * @param orderId 订单ID
     * @param tenantId 租户ID
     * @return 总金额
     */
    @Select("SELECT COALESCE(SUM(actual_amount), 0) FROM t_order_item WHERE order_id = #{orderId} AND tenant_id = #{tenantId} AND is_deleted = 0")
    BigDecimal sumAmountByOrderId(@Param("orderId") Long orderId, @Param("tenantId") Long tenantId);

    /**
     * 更新订单明细退款信息
     * @param itemId 明细ID
     * @param refundStatus 退款状态
     * @param refundAmount 退款金额
     * @param refundReason 退款原因
     * @param updateBy 更新人
     * @return 更新行数
     */
    @Update("UPDATE t_order_item SET refund_status = #{refundStatus}, refund_amount = #{refundAmount}, " +
            "refund_reason = #{refundReason}, refund_time = NOW(), update_by = #{updateBy}, update_time = NOW() " +
            "WHERE id = #{itemId} AND is_deleted = 0")
    int updateRefundInfo(@Param("itemId") Long itemId, @Param("refundStatus") String refundStatus,
                        @Param("refundAmount") BigDecimal refundAmount, @Param("refundReason") String refundReason,
                        @Param("updateBy") Long updateBy);

    /**
     * 批量插入订单明细
     * @param orderItems 订单明细列表
     * @return 插入行数
     */
    int batchInsert(@Param("orderItems") List<OrderItem> orderItems);

    /**
     * 批量插入订单明细（别名方法）
     * @param list 订单明细列表
     * @return 插入行数
     */
    default int insertBatch(@Param("list") List<OrderItem> list) {
        return batchInsert(list);
    }

    /**
     * 批量删除订单明细
     * @param orderId 订单ID
     * @param tenantId 租户ID
     * @param updateBy 更新人
     * @return 删除行数
     */
    @Update("UPDATE t_order_item SET is_deleted = 1, update_by = #{updateBy}, update_time = NOW() " +
            "WHERE order_id = #{orderId} AND tenant_id = #{tenantId} AND is_deleted = 0")
    int batchDeleteByOrderId(@Param("orderId") Long orderId, @Param("tenantId") Long tenantId, @Param("updateBy") Long updateBy);

    /**
     * 查询产品销量统计
     * @param tenantId 租户ID
     * @param merchantId 商家ID
     * @param startTime 开始时间
     * @param endTime 结束时间
     * @param limit 查询限制数量
     * @return 产品销量统计列表
     */
    List<Map<String, Object>> selectProductSalesStats(@Param("tenantId") Long tenantId, @Param("merchantId") Long merchantId,
                                                      @Param("startTime") LocalDateTime startTime, @Param("endTime") LocalDateTime endTime,
                                                      @Param("limit") Integer limit);

    /**
     * 查询分类销量统计
     * @param tenantId 租户ID
     * @param merchantId 商家ID
     * @param startTime 开始时间
     * @param endTime 结束时间
     * @return 分类销量统计列表
     */
    List<Map<String, Object>> selectCategorySalesStats(@Param("tenantId") Long tenantId, @Param("merchantId") Long merchantId,
                                                       @Param("startTime") LocalDateTime startTime, @Param("endTime") LocalDateTime endTime);

    /**
     * 查询品牌销量统计
     * @param tenantId 租户ID
     * @param merchantId 商家ID
     * @param startTime 开始时间
     * @param endTime 结束时间
     * @return 品牌销量统计列表
     */
    List<Map<String, Object>> selectBrandSalesStats(@Param("tenantId") Long tenantId, @Param("merchantId") Long merchantId,
                                                    @Param("startTime") LocalDateTime startTime, @Param("endTime") LocalDateTime endTime);

    /**
     * 查询退款统计
     * @param tenantId 租户ID
     * @param merchantId 商家ID
     * @param startTime 开始时间
     * @param endTime 结束时间
     * @return 退款统计
     */
    Map<String, Object> selectRefundStats(@Param("tenantId") Long tenantId, @Param("merchantId") Long merchantId,
                                         @Param("startTime") LocalDateTime startTime, @Param("endTime") LocalDateTime endTime);

    /**
     * 查询需要退款的订单明细
     * @param refundStatus 退款状态
     * @param limit 查询限制数量
     * @return 订单明细列表
     */
    List<OrderItem> selectRefundItems(@Param("refundStatus") String refundStatus, @Param("limit") Integer limit);

    /**
     * 统计商家产品销量
     * @param merchantId 商家ID
     * @param tenantId 租户ID
     * @param startTime 开始时间
     * @param endTime 结束时间
     * @return 销量统计
     */
    Map<String, Object> selectMerchantProductStats(@Param("merchantId") Long merchantId, @Param("tenantId") Long tenantId,
                                                   @Param("startTime") LocalDateTime startTime, @Param("endTime") LocalDateTime endTime);
}